package com.itheima.health.service.impl;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.health.dto.SetmealDTO;
import com.itheima.health.entity.PageResult;
import com.itheima.health.entity.QueryPageBean;
import com.itheima.health.mapper.SetmealMapper;
import com.itheima.health.pojo.CheckGroup;
import com.itheima.health.pojo.CheckItem;
import com.itheima.health.pojo.Setmeal;
import com.itheima.health.service.SetmealService;
import com.itheima.health.utils.aliyunoss.AliyunUtils;
import com.itheima.health.utils.redis.RedisUtil;
import com.itheima.health.utils.resources.RedisConstant;
import com.itheima.health.vo.CheckGroupVO;
import com.itheima.health.vo.SetmealVO;
import org.apache.commons.lang3.StringUtils;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Set;

@Service
@Transactional
public class SetmealServiceImpl extends ServiceImpl<SetmealMapper, Setmeal> implements SetmealService {


     //todo: 添加套餐
    @Override
    public Boolean saveSetmeal(SetmealDTO setmealDTO) {

        boolean flag = save(setmealDTO);//完成检查组的添加录入
        Integer sid = setmealDTO.getId();//获取id 添加到中间表
        //然后录入中间表
        Integer[] checkgroupIds = setmealDTO.getCheckgroupIds();
        if (checkgroupIds!=null&&checkgroupIds.length>0){
            for (Integer checkgroupId : checkgroupIds) {
                //中间表 循环录入
                baseMapper.addSetmealAndCheckGroup(sid,checkgroupId);
            }
        }
        //保存成功后 set集合中移除此图片信息  剩下的救赎垃圾图片
        RedisUtil.removeSetMember(RedisConstant.ALL_SETMEAL_PIC_SET,setmealDTO.getImg());

        return flag;
    }





      //todo:添加检查组 和录入
    //中间表数据添加

/*    @Override
    public Boolean saveCheckGroup(CheckGroupDTO checkGroupDTO) {
        Integer id = checkGroupDTO.getId();
        if (StringUtils.isNotBlank(String.valueOf(id))){
           //不为空 有id 就做修改操作
           //根据id 删除中间表数据
            baseMapper.deleteCheckItemInfoByGuroupId(id);
        }

        boolean flag = saveOrUpdate(checkGroupDTO);//完成检查组录入 自动生成主键
       //中间表数据添加需要主键
        Integer gid = checkGroupDTO.getId();
       //录入中间表
        Integer[] checkitemIds = checkGroupDTO.getCheckitemIds();
        if (checkitemIds!=null&&checkitemIds.length>0){
            //中间表 循环录入
            for (Integer checkitemId : checkitemIds) {

                baseMapper.addCheckGroupAndCheckItem(gid,checkitemId);
            }
        }
        return flag;
    }*/



    //todo ： 分页查询
    @Override
    public PageResult findPage(QueryPageBean queryPageBean) {
        //添加逻辑删除后 初始查询 要有select * from xxx where is_delete=0 and xxx like
        //构造条件 wrapper
        QueryWrapper<Setmeal> queryWrapper = new QueryWrapper<Setmeal>();
      //  queryWrapper.eq("is_delete", 0);
        Page<Setmeal> page = null;
        //有条件分页
        if (StringUtils.isBlank(queryPageBean.getQueryString())) {//如果查询条件为空 就执行无条件查询
            // 无条件分页查询
            page = page(new Page<Setmeal>(queryPageBean.getCurrentPage(), queryPageBean.getPageSize()),queryWrapper);
        } else {//如果有查询条件

            queryWrapper.like("name", queryPageBean.getQueryString());//name是数据库字段名 后面是查询的条件
           // queryWrapper.like("helpCode",queryPageBean.getQueryString());

            //上面相当于 sql语句 加上了where name =? 条件
            page = page(new Page<Setmeal>(queryPageBean.getCurrentPage(), queryPageBean.getPageSize()), queryWrapper);
        }
        PageResult pageResult = new PageResult(page.getTotal(), page.getRecords());
        return pageResult;
    }

    /**
     * 这个方法 以后被 xxl-job看见调用
     *///
    //todo:定期清理图片
    @Override
    public void clearOssImg() {
        //清理oss垃圾图片 阿里云上的 该方法由xxl-job调用
        //先拿到集合
        //1.获取set集合所有的图片信息
        Set<String> members = RedisUtil.getMembersOfSet(RedisConstant.ALL_SETMEAL_PIC_SET);
        if(members.size()!=0){//遍历集合
            for (String uuidfilename : members) {
                //每个集合对象 都是图片名称   xxx.jpg
              //遍历图片 判断redis上有没有这样的图片
                boolean b = RedisUtil.existsKey(RedisConstant.SINGLE_PIC + uuidfilename);
                if (b==false){//说明没有在redis找到  果断的再阿里云上删除
                    AliyunUtils.deleteFile(uuidfilename);//删除垃圾文件
                    System.out.println("---阿里云删除一次---");
                    //把set集合中垃圾图片删除掉  //优化一直删除
                    RedisUtil.removeSetMember(RedisConstant.ALL_SETMEAL_PIC_SET,uuidfilename);
                }
            }
        }

    }
       //todo:11.10 22. 移动端查询套餐 检查组 检查项
    @Override
    public SetmealVO findSetMealDetail(Integer id) {
        //3.sql

        //1.根据套餐id查询需要返回给前端的 套餐信息
        SetmealVO setmealVO = baseMapper.findSetMeal(id);

        //2.根据 套餐id 查询到检查组信息
        List<CheckGroupVO> checkGroupVOList = baseMapper.findGroupBySetmealId(id);
       // setmealVO.setCheckGroupList(checkGroupVOList);

        //3.根据检查组id  查询到对应的检查项 信息
        for (CheckGroupVO groupVO : checkGroupVOList) {
            List<CheckItem> checkItemList = baseMapper.findItemByGroupId(groupVO.getId());
            groupVO.setCheckItemList(checkItemList);
            //setmealVO.setCheckGroupList(checkGroupVOList);
        }
        setmealVO.setCheckGroupList(checkGroupVOList);

        return setmealVO;
    }


    //todo：逻辑删除
 /*   @Override
    public Boolean updateCheckGroupById(int id) {
        //逻辑删除 再查询时加上条件 Is_delete作的修改
        CheckGroup checkGroup = new CheckGroup();
        checkGroup.setId(id);
        checkGroup.setIs_delete(1);//查询的条件
        return updateById(checkGroup);
    }*/
     //todo:编辑数据回显
  /*  @Override
    public CheckGroupVO findCheckItemInfoByGroupId(int id) {
       //查询所有的检查项信息 + gid 查询对应的chackitemids 中间表
        List<CheckItem> list = checkItemService.list();
        //查询中间表 根据检查组的id 获得所有的检查项id  需要一个表
        int[] checkitemids= baseMapper.findCheckItemInfoByGroupId(id);
        CheckGroupVO checkGroupVO = new CheckGroupVO();
        checkGroupVO.setCheckItemList(list);
        checkGroupVO.setCheckitemIds(checkitemids);

        return checkGroupVO;
    }*/
}
